package halberd.filter;

import halberd.DataType;
import halberd.ImgFilter;
import halberd.data.ImgData;
import halberd.data.ImgDataFactory;
import halberd.utils.RGBUtils;

public class CameoFilter implements ImgFilter {
	public ImgData process(ImgData input) {
		if (!canProcess(input)) {
			return null;
		}
		ImgData result = ImgDataFactory.createImgData(input.getWidth(), input.getHeight());
		cameo(input.getDatas(), result.getDatas(), input.getWidth(), input.getHeight());
		result.setDataType(input.getDataType());
		return result;
	}

	private boolean canProcess(ImgData input) {
		if (input == null) {
			return false;
		}
		DataType dt = input.getDataType();
		if (dt == DataType.RGB) {
			return true;
		}
		if (dt == DataType.RGBA) {
			return true;
		}
		return false;
	}

	private void cameo(int[][][] src,int[][][] dst,int w,int h) {
		for (int i = 0; i< w; ++i)
        {
			int r1=0;
			int g1=0;
			int b1=0;
			for (int j = 0; j < h ; ++j)
		    {
		
				int r=src[i][j][0];
				int g=src[i][j][1];
				int b=src[i][j][2];
	            int r2 =RGBUtils.clamp255( r1 -r + 128);
	            int g2 = RGBUtils.clamp255(g1 - g+ 128);
	            int b2 =RGBUtils.clamp255(b1 -b+ 128);
	            r1 = r;
	            g1 = g;
	            b1 = b;
	            dst[i][j][0]=r2;
	            dst[i][j][1]=g2;
	            dst[i][j][2]=b2;
	        }
	  }
	}
}
